<?

class Application_Model_Pue extends Sgit_Model
{

    protected $_name = 'lecturas_sistemas';
    protected $_primary = 'id';
    protected $_cache_activa = true;
    protected $_profiler = true;


    protected $_pue_semanal = array();
    protected $_pue_mensual = array();


    /**
     * 
     * setZona
     * Solo para cálculo global
     * 
     */

    function setZona($idZona)
    {
        $this->idZona = $idZona;
    }

    function setFechas($inicio, $fin)
    {
        $this->f_inicio = $inicio;
        $this->f_fin = $fin;
    }


    function getPueSemanalZona($id_zona)
    {
        $this->getPueSemanal();
        return $this->_pue_semanal[$id_zona];
    }

    function getPueSemanalYw($yearweek)
    {
        $this->getPueSemanal();
        foreach ($this->_pue_semanal as $zona => $v)
        {
            $pues[$zona] = $this->_pue_semanal[$zona][$yearweek];
        }
        return $pues;
    }

    function getPueSemanalYwZona($yearweek, $id_zona)
    {
        $this->getPueSemanal();
        return $pues[$id_zona] = $this->_pue_semanal[$id_zona][$yearweek];
    }


    function getPueSemanalFecha($fecha)
    {
       
        $yearweek = date('YW', strtotime($fecha));
        Zend_Debug::dump($yearweek);
        
        return $this->getPueSemanalYw($yearweek);
    }

    function getPueSemanalFechaZona($fecha, $id_zona)
    {
        $yearweek = date('YW', strtotime($fecha));
        return $this->getPueSemanalYwZona($yearweek, $id_zona);
    }
    
    
    function getPueSemanalCM($fecha, $id_zona)
    {
        $last_semana=date('YW',strtotime(" -1 week",strtotime($fecha)));
        
        $yearweek = date('YW', strtotime($fecha));
        $last_yearweek=date('YW',strtotime(" -1 week",strtotime($fecha)));
        
        
        $this->getPueSemanal();
        

        $data1 = $this->_pue_semanal[$id_zona][$yearweek];
        $data2 = $this->_pue_semanal[$id_zona][$last_yearweek];
        
        //$data1=$pues1[$id_zona];
        //$data2=$pues2[$id_zona];
        
        $salida['pue']=$data1['pue'];
        $salida['pue_acumulado']=$data1['pue_acumulado'];
        $salida['pue_acumulado_mes']=$data1['pue_acumulado_mes'];
        $salida['pue_anterior']=$data2['pue'];
                
       
        return $salida;       
        
    }
    
    


    function getPueMensualMes($anio, $mes)
    {
        $this->getPueMensual();

        foreach ($this->_pue_mensual as $zona => $v)
        {
            $pues[$zona] = $this->_pue_mensual[$zona][$anio][$mes];
        }
        return $pues;
    }

    function getPueMensualZona($zona)
    {
        $this->getPueMensual();
        return $this->_pue_mensual[$zona];
    }





    function getPueSemanalObjetivoByMes($anio,$mes)
    {
        
        $fecha=mktime(1,1,1,$mes,1,$anio);
        $fecha=strtotime(date('Y-m-27',$fecha));
        $yw=date('YW',$fecha);
        
        $this->getPueSemanalObjetivo($anio);
        
        $this->_pue_semanal_objetivo;
        
        foreach($this->_pue_semanal_objetivo as $zona => $v)
        {
            $v[$yw]['semana']=$yw;
            $salida[$zona]=$v[$yw];
        }
        
        return $salida;
    }


    




    function getPueSemanal()
    {

        if (!$this->_pue_semanal)
        {

            $select = $this->getAdapter()->select();
            $select->from(array('lecturas_sistemas'), array('potencia' => new Zend_Db_Expr("SUM(potencia)"), 'f_lectura'));
            $select->joinLeft('contadores_sistemas', 'contadores_sistemas.id = lecturas_sistemas.id_contador', array('id_tipo_sistema', 'id_zona'));
            $select->where('cm = ?', 1);


            $select->where('f_lectura >= ?', $this->f_inicio)->where('f_lectura < ?', $this->f_fin);

            $select->where('id_tipo_sistema IN (?)', array(3, 6, 7, 9));
            $select->where('id_zona IN (?)', $this->idZona);
            $select->group(array('id_zona', 'id_tipo_sistema', 'week(f_lectura)', 'YEAR(f_lectura)'));
            $select->order('f_lectura');
            $rows = $this->getAdapter()->fetchAll($select);


            foreach ($rows as $v)
            {

                $f_lectura = date('YW', strtotime($v['f_lectura']));
                $m = date('n', strtotime($v['f_lectura']));

                if ($m == 1 && (int)substr($f_lectura, 4, 2) > 6)
                    $f_lectura = substr($f_lectura, 0, 4) . '00';

                $val2[$v['id_zona']][$f_lectura][$v['id_tipo_sistema']]['potencia'] = $v['potencia'];
                $val2[$v['id_zona']][$f_lectura][$v['id_tipo_sistema']]['f_lectura'] = $v['f_lectura'];


            }


            foreach ($val2 as $zona => $val)
            {
                foreach ($val as $fecha => $v)
                {
                    $mes = date('m', strtotime($v[6]['f_lectura']));
                    $pues[$zona][$fecha]['f_lectura'] = $v[6]['f_lectura'];
                    $pues[$zona][$fecha]['f_inicio'] = $this->f_inicio;
                    $pues[$zona][$fecha]['f_fin'] = $this->f_fin;

                    $pues[$zona][$fecha]['semana'] = substr($fecha, 4, 2);
                    $pues[$zona][$fecha]['mes'] = $mes;
                    $pues[$zona][$fecha]['anio'] = substr($fecha, 0, 4);
                    $pues[$zona][$fecha]['id_zona'] = $zona;
                    if($v[9]['potencia'] + $v[7]['potencia'] + $v[3]['potencia']){
                        $pues[$zona][$fecha]['pue'] = round($v[6]['potencia'] / ($v[9]['potencia'] + $v[7]['potencia'] + $v[3]['potencia']), 4);
                    }
                    $pues[$zona][$fecha]['facility'] = $v[6]['potencia'];
                    $pues[$zona][$fecha]['it'] = $v[9]['potencia'] + $v[7]['potencia'] + $v[3]['potencia'];

                    $sum_facility[$zona] += $v[6]['potencia'];
                    $sum_it[$zona] += $v[9]['potencia'] + $v[7]['potencia'] + $v[3]['potencia'];

                    $pues[$zona][$fecha]['pue_acumulado'] = round($sum_facility[$zona] / $sum_it[$zona], 4);
                    $pues[$zona][$fecha]['facility_acumulado'] = round($sum_facility[$zona], 2);
                    $pues[$zona][$fecha]['it_acumulado'] = round($sum_it[$zona], 2);

                    $sum_facility_mes[$zona][$mes] += $v[6]['potencia'];
                    $sum_it_mes[$zona][$mes] += $v[9]['potencia'] + $v[7]['potencia'] + $v[3]['potencia'];

                    $pues[$zona][$fecha]['it_acumulado_mes'] = round($sum_it_mes[$zona][$mes], 2);
                    $pues[$zona][$fecha]['facility_acumulado_mes'] = round($sum_facility_mes[$zona][$mes], 2);
                    $pues[$zona][$fecha]['pue_acumulado_mes'] = round($sum_facility_mes[$zona][$mes] / $sum_it_mes[$zona][$mes], 4);

                }
            }


            $pues['global'] = $this->getPueGlobalSemanal();
            $this->_pue_semanal = $pues;
        }

        return $this->_pue_semanal;

    }


    function getPueGlobalSemanal()
    {

        $select = $this->getAdapter()->select();
        $select->from(array('lecturas_sistemas'), array('potencia' => new Zend_Db_Expr("SUM(potencia)"), 'f_lectura'));
        $select->joinLeft('contadores_sistemas', 'contadores_sistemas.id = lecturas_sistemas.id_contador', array('id_tipo_sistema'));
        $select->where('cm = ?', 1);

        $select->where('f_lectura >= ?', $this->f_inicio)->where('f_lectura < ?', $this->f_fin);


        $select->where('id_tipo_sistema IN (?)', array(3, 6, 7, 9));
        $select->where('id_zona IN (?)', $this->idZona);
        $select->group(array('id_tipo_sistema', 'week(f_lectura)', 'YEAR(f_lectura)'));
        $select->order('f_lectura');
        $rows = $this->getAdapter()->fetchAll($select);


        foreach ($rows as $v)
        {

            $f_lectura = date('YW', strtotime($v['f_lectura']));

            //para quitar la primera semana si pertenece al año anterior
            $m = date('n', strtotime($v['f_lectura']));
            if ($m == 1 && (int)substr($f_lectura, 4, 2) > 6)
                $f_lectura = substr($f_lectura, 0, 4) . '00';

            $val2[$f_lectura][$v['id_tipo_sistema']]['potencia'] = $v['potencia'];
            $val2[$f_lectura][$v['id_tipo_sistema']]['f_lectura'] = $v['f_lectura'];
        }

        foreach ($val2 as $fecha => $v)
        {

            $mes = date('m', strtotime($v[6]['f_lectura']));
            $pues[$fecha]['f_lectura'] = $v[6]['f_lectura'];
            $pues[$fecha]['f_inicio'] = $this->f_inicio;
            $pues[$fecha]['f_fin'] = $this->f_fin;

            $pues[$fecha]['semana'] = substr($fecha, 4, 2);
            $pues[$fecha]['mes'] = $mes;
            $pues[$fecha]['anio'] = substr($fecha, 0, 4);
            $pues[$fecha]['id_zona'] = implode(',', $this->idZona);

            if($v[9]['potencia'] + $v[7]['potencia'] + $v[3]['potencia']){
                $pues[$fecha]['pue'] = round($v[6]['potencia'] / ($v[9]['potencia'] + $v[7]['potencia'] + $v[3]['potencia']), 4);
            }
            $pues[$fecha]['facility'] = $v[6]['potencia'];
            $pues[$fecha]['it'] = $v[9]['potencia'] + $v[7]['potencia'] + $v[3]['potencia'];

            $sum_facility += $v[6]['potencia'];
            $sum_it += $v[9]['potencia'] + $v[7]['potencia'] + $v[3]['potencia'];

            $pues[$fecha]['pue_acumulado'] = round($sum_facility / $sum_it, 4);
            $pues[$fecha]['facility_acumulado'] = round($sum_facility, 2);
            $pues[$fecha]['it_acumulado'] = round($sum_it, 2);


            $sum_facility_mes[$mes] += $v[6]['potencia'];
            $sum_it_mes[$mes] += $v[9]['potencia'] + $v[7]['potencia'] + $v[3]['potencia'];

            $pues[$fecha]['it_acumulado_mes'] = round($sum_it_mes[$mes], 2);
            $pues[$fecha]['facility_acumulado_mes'] = round($sum_facility_mes[$mes], 2);
            $pues[$fecha]['pue_acumulado_mes'] = round($sum_facility_mes[$mes] / $sum_it_mes[$mes], 4);


        }


        return $pues;

    }


    function getPueSemanalObjetivo($anio)
    {
        
        
        if(!$this->_pue_semanal_objetivo){
        
            $anio_siguiente=$anio+1;
            $anio_anterior = $anio-1;
            
            $pue_real = new Application_Model_Pue();
            $pue_real->setZona($this->idZona);
            $pue_real->setFechas("$anio-01-01", "$anio_siguiente-01-01");
            $pues_real= $pue_real->getPueSemanal();
    
    
            foreach($pues_real as $k=> $v){
                $key_max_real[$k] = max(array_keys($v));
            }
    
    
    
    
            $pue = new Application_Model_Pue();
            $pue->setZona($this->idZona);
            $pue->setFechas("$anio_anterior-01-01", "$anio-01-01");
            $pues = $pue->getPueSemanal();
    
    
    
    
    
            foreach($pues as $zona => $pues_zona){
    
                $objetivos = $pue->getObjetivos();
                $objetivo = $objetivos[$anio][$zona];
        
                $key_max = max(array_keys($pues_zona));
                $diff = round($pues_zona[$key_max]['pue_acumulado'] - $objetivo, 5);
        
                foreach ($pues_zona as $fecha => $v)
                {
                    $fecha=(substr($fecha,0,4)+1).substr($fecha,4,2);
                    $nuevo[$zona][$fecha]['plan'] = $v['pue_acumulado'] - $diff;
                    $nuevo[$zona][$fecha]['anterior'] = $v['pue_acumulado'];
                    $nuevo[$zona][$fecha]['real'] = $pues_real[$zona][$fecha]['pue_acumulado'];
                    $nuevo[$zona][$fecha]['semana'] = $fecha;
                    
                    
                    if($last[$zona] && $nuevo[$zona][$fecha]['real']){
                        $nuevo[$zona][$fecha]['variacion']=round($last[$zona]-$nuevo[$zona][$fecha]['real'],4);;
                    }else {
                        $nuevo[$zona][$fecha]['variacion']=0;
                    }
                        
                    $last[$zona]=$nuevo[$zona][$fecha]['real'];
                }
                
                
                $diff_real = round($nuevo[$zona][$key_max_real[$zona]]['anterior']-$pues_real[$zona][$key_max_real[$zona]]['pue_acumulado'], 5);
    
                
                foreach ($nuevo[$zona] as $fecha => $v)
                {
                    if(!$nuevo[$zona][$fecha]['real']) {
                        $nuevo[$zona][$fecha]['previsto'] =$nuevo[$zona][$fecha]['anterior'] - $diff_real;
                    }else {
                        $nuevo[$zona][$fecha]['previsto']=$nuevo[$zona][$fecha]['real'];
                        $lastreal=$fecha;
                    }
                    $nuevo[$zona][$fecha]['lastreal']=$lastreal;    
                }
                    
                
           }  
           
           $this->_pue_semanal_objetivo=$nuevo;  
              
       }

        return $this->_pue_semanal_objetivo;
    }



    function getPueGlobalSemanalObjetivo($anio)
    {
         $this->getPueSemanalObjetivo($anio);
         return $this->_pue_semanal_objetivo['global'];
    }






    function getPueMensual()
    {

        if (!$this->_pue_mensual)
        {
            $select = $this->getAdapter()->select();
            $select->from(array('lecturas_sistemas'), array('potencia' => new Zend_Db_Expr("SUM(potencia)"), 'f_lectura'));
            $select->joinLeft('contadores_sistemas', 'contadores_sistemas.id = lecturas_sistemas.id_contador', array('id_tipo_sistema', 'id_zona'));
            $select->where('cm = ?', 1);


            $select->where('f_lectura >= ?', $this->f_inicio)->where('f_lectura < ?', $this->f_fin);

            $select->where('id_tipo_sistema IN (?)', array(3, 6, 7, 9));
            $select->where('id_zona IN (?)', $this->idZona);
            $select->group(array('id_zona', 'id_tipo_sistema', 'MONTH(f_lectura)', 'YEAR(f_lectura)'));
            $select->order('f_lectura');
            $rows = $this->getAdapter()->fetchAll($select);


            foreach ($rows as $v)
            {
                $mes = date('Yn', strtotime($v['f_lectura']));
                $val2[$v['id_zona']][$mes][$v['id_tipo_sistema']]['potencia'] = $v['potencia'];
                $val2[$v['id_zona']][$mes][$v['id_tipo_sistema']]['f_lectura'] = $v['f_lectura'];
            }


            foreach ($val2 as $zona => $val)
            {
                foreach ($val as $fecha => $v)
                {
                    $anio = substr($fecha, 0, 4);
                    $mes = substr($fecha, 4, 2);

                    $pues[$zona][$anio][$mes]['f_inicio'] = $this->f_inicio;
                    $pues[$zona][$anio][$mes]['f_fin'] = $this->f_fin;
                    $pues[$zona][$anio][$mes]['mes'] = $mes;
                    $pues[$zona][$anio][$mes]['anio'] = $anio;
                    $pues[$zona][$anio][$mes]['id_zona'] = $zona;

                    $pues[$zona][$anio][$mes]['pue'] = round($v[6]['potencia'] / ($v[9]['potencia'] + $v[7]['potencia'] + $v[3]['potencia']), 4);
                    $pues[$zona][$anio][$mes]['dcie'] = round(1 / $pues[$zona][$anio][$mes]['pue'], 4);

                    $pues[$zona][$anio][$mes]['facility'] = round($v[6]['potencia'], 2);
                    $pues[$zona][$anio][$mes]['it'] = round($v[9]['potencia'] + $v[7]['potencia'] + $v[3]['potencia'], 2);

                }
            }


            $pues['global'] = $this->getPueGlobalMensual();
            $this->_pue_mensual = $pues;

        }
        return $this->_pue_mensual;

    }


    function getPueGlobalMensual()
    {

        $select = $this->getAdapter()->select();
        $select->from(array('lecturas_sistemas'), array('potencia' => new Zend_Db_Expr("SUM(potencia)"), 'f_lectura'));
        $select->joinLeft('contadores_sistemas', 'contadores_sistemas.id = lecturas_sistemas.id_contador', array('id_tipo_sistema'));
        $select->where('cm = ?', 1);

        $select->where('f_lectura >= ?', $this->f_inicio)->where('f_lectura < ?', $this->f_fin);


        $select->where('id_tipo_sistema IN (?)', array(3, 6, 7, 9));
        $select->where('id_zona IN (?)', $this->idZona);
        $select->group(array('id_tipo_sistema', 'MONTH(f_lectura)', 'YEAR(f_lectura)'));
        $select->order('f_lectura');
        $rows = $this->getAdapter()->fetchAll($select);


        foreach ($rows as $v)
        {

            $f_lectura = date('Yn', strtotime($v['f_lectura']));
            $val2[$f_lectura][$v['id_tipo_sistema']]['potencia'] = $v['potencia'];
            $val2[$f_lectura][$v['id_tipo_sistema']]['f_lectura'] = $v['f_lectura'];
        }

        foreach ($val2 as $fecha => $v)
        {

            $anio = substr($fecha, 0, 4);
            $mes = substr($fecha, 4, 2);

            $pues[$anio][$mes]['f_inicio'] = $this->f_inicio;
            $pues[$anio][$mes]['f_fin'] = $this->f_fin;
            $pues[$anio][$mes]['mes'] = $mes;
            $pues[$anio][$mes]['anio'] = $anio;
            $pues[$anio][$mes]['id_zona'] = $zona;

            $pues[$anio][$mes]['pue'] = round($v[6]['potencia'] / ($v[9]['potencia'] + $v[7]['potencia'] + $v[3]['potencia']), 4);
            $pues[$anio][$mes]['dcie'] = round(1 / $pues[$anio][$mes]['pue'], 4);

            $pues[$anio][$mes]['facility'] = round($v[6]['potencia'], 2);
            $pues[$anio][$mes]['it'] = round($v[9]['potencia'] + $v[7]['potencia'] + $v[3]['potencia'], 2);


        }


        return $pues;

    }

    /**
     * 
     * Devuelve todos los objetivos, no hay volumen para centrarnos solo en el año.
     * 
     * return $objetivo[anio][zona]
     */
    function getObjetivos()
    {

        $select = $this->getAdapter()->select();
        $select->from(array('constantes'), array('nombre', 'valor'));
        $select->where('nombre LIKE ?', "objetivo%");
        $rows = $this->getAdapter()->fetchAll($select);

        foreach ($rows as $v)
        {
            $aux = $v['nombre'] = explode('_', $v['nombre']);
            if (strlen($aux[1]) > 2)
            {
                $obj[$aux[1]]['global'] = $v['valor'];
            } else
            {
                $obj[$aux[2]][$aux[1]] = $v['valor'];
            }
        }

        return $obj;
    }



	function speedPue($anio,$mes)
	{

  

        $pue_proyeccion=$this->getPueSemanalObjetivoByMes($anio,$mes);
   
   
 
              
                      
        if(count($this->idZona)==1)
        {
            $keyzona=$this->idZona[0];
        }else{
            $keyzona='global';
        }
            
            
       
        $lastreal =$pue_proyeccion[$keyzona]['lastreal'];
        
        $pue=$this->getPueSemanalObjetivoByMes($anio,$mes);
        

        
        $ytd=$pue[$keyzona];
        $C=$pue_proyeccion[$keyzona];
        

        
        $actual=$ytd['previsto'];
        
        $planed=$ytd['plan'];
        
  

        $view = Zend_Controller_Front::getInstance()->getParam('bootstrap')->getResource('view');
        
		$actual2 = $view->numES($actual, 2);
        
		$planed2 =$view->numES($planed, 2);



        if($planed<1){
		$titulo =sprintf($view->translate("PUE YTD Actual(%s) "),$actual2);
       // (" PUE YTD Actual($actual2) vs Plan($planed2)",)
        }else{
            	$titulo =sprintf($view->translate("PUE YTD Actual(%s) vs Plan(%s)"),$actual2,$planed2);
       // (" PUE YTD Actual($actual2) vs Plan($planed2)",)
        }

		$centro = 2;
        $max = ( $centro + max( abs( $centro - $actual ), abs( $centro - $planed ) ) ) * 1.015;
		$min = ( $centro - max( abs( $centro - $actual ), abs( $centro - $planed ) ) ) * 0.985;
        $por1 = ( ( $max - $actual ) / ( $max - $min ) ) * 100;
		$por2 = ( ( $max - $planed ) / ( $max - $min ) ) * 100;


        if($planed<1){

    		$data2['chd'] = "$por1";
    		$data2['chl'] = "$actual2";
    		$data2['chxl'] = "|" . round( $max, 2 ) . "|" . round( $centro + ( ( $max - $centro ) / 2 ), 2 ) . "|$centro|" . round( $centro + ( ( $min - $centro ) / 2 ), 2 ) . "|" . round( $min, 2 ) . "";
    		

        }else{
       	    $data2['chd'] = "$por1|$por2";
    		$data2['chl'] = "$actual2|$planed2";
    		$data2['chxl'] = "|" . round( $max, 2 ) . "|" . round( $centro + ( ( $max - $centro ) / 2 ), 2 ) . "|$centro|" . round( $centro + ( ( $min - $centro ) / 2 ), 2 ) . "|" . round( $min, 2 ) . "";
    		$data2['chls'] = "1|2,5,8|10|5";
        }
        
		$salida2['chart'] = $this->chart( $data2 );
		$salida2['titulo'] = $titulo;
        $salida2['plan'] = $planed;
        $salida2['actual'] = $actual;
        $salida2['lastreal'] = $lastreal;
        $salida2['mes'] = $mes;
        $salida2['anio'] = $anio;
		$salida2['mas'] = sprintf($view->translate("Acumulado a %s %s"),Sgit_Filter_Mes::filter($mes),$anio);
        
        
        
        
        
        $actual=$C['previsto'];
        $planed=$C['plan'];
    

		$actual2 = $view->numES( $actual, 2 );
		$planed2 = $view->numES( $planed, 2 );

		$titulo =sprintf($view->translate("PUE Proyección (%s) vs Plan(%s)"),$actual2,$planed2);

		$centro = 2;
		$por1 = ( ( $max - $actual ) / ( $max - $min ) ) * 100;
		$por2 = ( ( $max - $planed ) / ( $max - $min ) ) * 100;

		$data3['chd'] = "$por1|$por2";
		$data3['chl'] = "$actual2|$planed2";
		$data3['chxl'] = "|" . round( $max, 2 ) . "|" . round( $centro + ( ( $max - $centro ) / 2 ), 2 ) . "|$centro|" . round( $centro + ( ( $min - $centro ) / 2 ), 2 ) . "|" . round( $min, 2 ) . "";
		$data3['chls'] = "1|2,5,8|10|5";

		$salida3['chart'] = $this->chart( $data3 );
		$salida3['titulo'] = $titulo;
        $salida3['plan'] = $planed;
        $salida3['actual'] = $actual;
        $salida3['lastreal'] = $lastreal;
        $salida3['mes'] = $mes;
        $salida3['anio'] = $anio;

        $salida3['mas'] = sprintf($view->translate("Proyección a fin de año %s vs Objetivo a fin de año"),$anio);
        


		$chart['ytd']=$salida2;
        $chart['C']=$salida3;
       
        return $chart;


	}










    function chart($data)
    {

        if (empty($data['chs']))
            $data['chs'] = '320x170';
        if (empty($data['chls']))
            $data['chls'] = '2|14';
        if (!empty($data['chd']))
            $data['chd'] = 't:' . $data['chd'];
        if (!empty($data['chxl']))
            $data['chxl'] = '0:' . $data['chxl'];

        foreach ($data as $k => $v)
        {
            $params[] = "$k=$v";
        }
        $parametros = implode('&', $params);


        $chart = "http://chart.apis.google.com/chart?cht=gom&chxt=y&" . $parametros;

        return $chart;
    }


}
